package com.kaifamiao.month03.day0313;

import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.Scanner;

/**
 * 1. 能够录入用户信息
 * 2. 查看用户账户信息
 * 3. 查看用户余额
 * 4. 存款
 * 5. 取款
 * 6. 销户
 * 7. 退出
 */
public class Bank{

    Scanner in = new Scanner(System.in); // 创建输入对象
    static User[] users = new User[10];
    int count = 0;
    SimpleDateFormat df = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");

    public static void main(String[] args) {
        Bank bank = new Bank();
        bank.start();
    }

    /**
     * 欢迎界面
     */
    public void start(){
        print("****************************");
        print("*     欢迎光临开发喵银行      *");
        print("****************************");
        menu();
    }

    /**
     * 开始菜单界面
     */
    public void menu(){
        print("请按照要求输入您要操作的业务：");
        print("1.开户");
        print("2.登录");
        print("3.查询所有账户");
        print("4.查询所有流水记录");
        print("0.退出");
        int type = in.nextInt();
        typeSelect(type);
    }

    /**
     * 登录菜单界面
     * @param n 登录成功的用户账户号
     */
    public void loginMenu(int n ){
        Date now = new Date();
        print("亲爱的 " + users[n].name + " ,欢迎来到开发喵银行！" + df.format(now));
        print("请按照要求输入您要操作的业务类型：");
        print("1.查看账户信息");
        print("2.存款");
        print("3.取款");
        print("4.查询余额");
        print("5.查询流水记录");
        print("9.销户");
        print("0.返回主页面");
        int type = in.nextInt();
        typeSelect(type,n);
    }

    /**
     * 获取操作类型
     * @param type 需要判断的操作类型的数字
     */
    public void typeSelect(int type){
        switch (type) {
            case 1 -> creatUser(); // 创建用户
            case 2 -> login(); // 登录
            case 3 -> find();  // 查询所有账户信息
            case 4 -> allCookies(); // 查询流水记录
            case 0 -> quit(); // 退出账户
            default -> menu();
        }
    }

    /**
     * 根据输入获取操作类型
     * @param type 需要判断的操作类型的数字
     * @param n 已经成功登录的用户账户号
     */
    public void typeSelect(int type,int n){
        switch (type){
            case 1 -> searchUser(n); // 查询用户信息
            case 2 -> deposit(n); // 存款业务
            case 3 -> withdrawal(n); // 取款业务
            case 4 -> searchMoney(n); // 查询余额
            case 5 -> findCookies(n); // 查询余额
            case 9 -> logout(n); // 注销账户
            case 0 -> exit(n); // 退出账户
            default -> loginMenu(n); // 返回登录成功界面
        }
    }

    /**
     * 创建用户
     */
    public void creatUser(){
        User user = new User();
        print("请输入用户姓名：");
        user.name = in.next();
        while(true){
            print("请输入密码：");
            user.password = in.next();
            print("请确认密码：");
            String rePass = in.next();
            if(!rePass.equals(user.password)){
                print("两次密码不一致，请重新输入... 输入q 返回菜单界面");
                String s = in.next();
                if("q".equals(s)){
                    menu();
                }
            }else{
                break;
            }
        }
        while(true){
            print("请输入电话号码：");
            user.number = in.next();
            if(user.number.length() != 11){
                print("请输入正确的手机号码...");
            }else {
                break;
            }
        }
        User.money = 0.0;
        user.card = System.currentTimeMillis();
        user.no = count;
        Date date = new Date();
        user.cookies[user.cookiesCount ++] = "时间：" + df.format(date) + "  业务类型：创建用户" ; // 记录流水
        if(count == users.length){
            users = Arrays.copyOf(users,users.length * 2);
        }
        print("创建用户成功！");
        print("卡号：" + user.card);
        users[count ++] = user;
        menu();
    }

    /**
     * 用户登录
     */
    public void login(){
        print("请输入电话号码：");
        String phone = in.next();
        int index = getIndex(phone);
        if(index != -1){
            while(true){
                print("请输入密码：");
                String pass = in.next();
                if(pass.equals(users[index].password)){
                    // 密码正确进入登录成功界面
                    loginMenu(index);
                    break;
                }else{
                    print("小可爱，你把密码记错了。"); // 密码错误重新输入账户号，密码
                }
            }
        }else{
            print("账户不存在，请重新输入...");
            login();
        }
    }

    /**
     * 显示所有用户信息
     */
    public void find(){
        print("当前共有：" + count + " 人");
        for(int i = 0; i < count; i ++){
            users[i].show();
        }
        menu();
    }
    /**
     * 所有用户流水
     */
    public void allCookies(){
        for(int i = 0; i < count; i ++){
            users[i].showCookies(users[i].cookiesCount);
        }
    }
    /**
     * 根据电话获取用户所在数组的下标
     * @param phone 用户输入的电话号码
     */
    public int getIndex(String phone){
        for(int i = 0; i < count; i ++){
            if(phone.equals(users[i].number)){
                return i;
            }
        }
        return -1; // 没找到返回-1
    }



    /**
     * 查询用户信息
     * @param n 需要查询的账户号
     */
    public void searchUser(int n){
        print("****************************");
        print("用户姓名：" + users[n].name);
        print("电话号码：" + users[n].number);
        print("卡号：" + users[n].card);
        print("****************************");
        loginMenu(n);
    }

    /**
     * 存款业务
     * @param n 需要查询的账户号
     */
    public void deposit(int n ){
        print("请输入您要存的金额：");
        double money = in.nextDouble();
        User.money += money;
        print("存款成功！");
        Date date = new Date();
        if(users[n].cookies.length == users[n].cookiesCount){
            users[n].cookies = Arrays.copyOf(users[n].cookies,users[n].cookies.length * 2);
        }
        users[n].cookies[users[n].cookiesCount ++] =  "时间：" + df.format(date) + "  业务类型：存款  " + money;
        searchMoney(n);
        loginMenu(n);
    }

    /**
     * 取款业务
     */
    public void withdrawal(int n ){
        while(true){
            print("请输入您要取的金额：");
            double money = in.nextDouble();
            if(money <= User.money){
                User.money -= money;
                print("取款成功！");
                Date date = new Date();
                if(users[n].cookies.length == users[n].cookiesCount){
                    users[n].cookies = Arrays.copyOf(users[n].cookies,users[n].cookies.length * 2);
                }
                users[n].cookies[users[n].cookiesCount ++] =  "时间：" + df.format(date) + "  业务类型：取款  " + money;
                searchMoney(n);
                break;
            }else{
                print("余额不足！");
                if(User.money == 0.0){
                    print("您的余额为 0 ，请先存款：");
                    deposit(n);
                }
            }
        }
        loginMenu(n);
    }

    /**
     * 查询余额
     * @param n 需要查询的账户号
     */
    public void searchMoney(int n ){
        print("****************************");
        print("账户余额：" + User.money);
        print("****************************");
        loginMenu(n);
    }

    /**
     * 查询用户流水
     * @param n 需要查询的账户
     */
    public void findCookies(int n){
        users[n].showCookies(users[n].cookiesCount);
        loginMenu(n);
    }

    /**
     * 注销账户
     * @param n 需要注销的账户号
     */
    public  void logout(int n ){
        System.arraycopy(users,n + 1, users, n,count - n - 1);
        users[count --] = null;
        print("注销成功");
        menu();
    }

    /**
     * 退出登录
     * @param n 需要退出的账户号
     */
    public void exit(int n){
        System.out.println("确定退出?（y 确定 n 取消）");
        String e = in.next();
        if("y".equals(e)){
            menu();
        }else if("n".equals(e)){
            loginMenu(n);
        }
    }

    /**
     * 强制退出界面
     */
    public void quit(){
        System.out.println("确定退出?（y 确定 n 取消）");
        String e = in.next();
        if("y".equals(e)){
            System.out.println("系统即将退出，请注意保存您的数据...");
            try {
                Thread.sleep(3000);
            } catch (InterruptedException em) {
                em.printStackTrace();
            }
            print("****************************");
            print("*     欢迎光临开发喵银行      *");
            print("****************************");
            System.exit(0);
        }else{
            menu();
        }
    }

    /**
     * 向控制台输出字符串
     * @param str 想要输出的字符串
     */
    public void print(String str){
        System.out.println(str);
    }
}

